5분만에 읽는 도커 기본 – 개요, 명령어
안녕하세요 클래스메소드의 수재입니다.
한동안 보지않았던 컨테이너와 쿠버네티스 공부를 다시 시작하고 있습니다.
오랫동안 보지 않았어서 그런지 도커 내용부터 헷갈리는 내용이 조금씩 있었습니다 ㅎㅎ...
그래서 앞으로도 제가 한번씩 참고할 수 있도록 메모같은 느낌으로 쓱 훑을 수 있도록 내용을 정리해두려합니다.
개요
- 다음과 같은 명령어로 도커를 실행
$ service docker start # or $ systemctl enable docker
-
컨테이너에서 나올 때 exit 명령어 쓰면 컨테이너가 정지되어 버리니까 컨트롤 + P,Q로 나오자
run
명령어에서 옵션-i
는 상호 입출력을-t
는 bash 사용-d
옵션(detached 모드)을 사용하면 입출력 프롬프트 없이 컨테이너 실행- detached 모드로 생성한 컨테이너에 들어가고 싶으면
docker exec -i -t {컨테이너 이름} /bin/bash
- detached 모드로 생성한 컨테이너에 들어가고 싶으면
- foreground 프로그램이 실행되는 컨테이너가 아니라면 자동 종료(한번씩 헷갈리니 조심)
- 컨테이너 생성의 흐름
run
명령어- docker pull -> docker create -> docker start -> docker attach
create
명령어- docker pull -> docker create
- 볼륨에 대해
-v
옵션으로 볼륨 지정docker run -v {호스트에서 공유할 디렉토리 경로}:{컨테이너에서 공유할 디렉토리 경로} ubuntu:latest
-v
옵션말고도-- volumes-from
옵션을 사용하여 다른 컨테이너의 볼륨을 그대로 이용하는 방법도 있음- 즉 볼륨 전용 컨테이너를 만들어 활용하는 방법
- 혹은 미리 생성한 도커 볼륨을 사용할 수 있음
- 볼륨 생성 명령어는
docker volume create --name {볼륨명}
- 볼륨 생성 명령어는
inspect
명령어를 사용하면 해당 타입의 개체의 정보를 알 수 있음docker inspect -type {volume/container 등등} {개체명}
docker inspect —type volume {볼륨명}
네트워크
- 도커가 제공하는 네트워크 드라이버에는 호스트, 논, 컨테이너, 브릿지(브리지라고도 함), 오버레이가 있음
- 호스트(host) : 호스트의 네트워크를 그대로 사용
- 논(none) : 아무런 네트워크도 사용하지 않음
- 컨테이너(container) : 다른 컨테이너의 네트워크 네임스페이스 환경을 공유
docker run -i -t --name container_name --net container:{다른 컨테이너 명} ubuntu
- 브릿지(bridge) : 브릿지를 통해 각 컨테이너의 veth가 통신
--net-alias {별칭}
으로 한 브릿지 내의 여러 컨테이너를 구분 할 수 있음- 도커 내부의 DNS가 각 별칭을 각 컨테이너의 주소로 변환
- 특정 대역을 갖는 네트워크(브리지, 오버레이)가 VPC와 같은 역할을 하고 있어서 docker0 브리지는 사용하지 않음
- 오버레이(overlay) : 여러 개의 도커 데몬을 하나의 네트워크 풀로 만드는 가상화 된 네트워크
- 스웜에서 다시 나옴
- 브릿지 / 오버레이 네트워크는
network connet 나 network disconnect
등의 명령어 사용 가능 - 서브넷, 게이트웨이, IP 할당 범위 등을 설정 가능
docker network create --driver=bridge --subnet=172.2.0.0/16 --ip-range=172.2.0.0/24 --gateway=172.72.0.1 {컨테이너명}
로깅
docker logs {컨테이너명}
명령어로 컨테이너의 에러 로그 등을 확인 가능--since {유닉스 시간}, --tail {마지막 몇 줄}
등의 옵션을 활용하여 편하게 로깅 가능- 컨테이너를 생성할 때
-f
옵션을 붙이면 실시간 로깅이 활성화 - 컨테이너의 로그는
/var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log
에 남아있음 - 로그의 드라이버를 선택할 수 있음
- syslog, journald, fluentd, awslogs 등이 있음
docker start --log-driver=syslogs
와 같이 지정
- 도커 데몬 옵션으로 드라이버나 다른 옵션 등을 일괄적으로 변경할 수 있음
컨테이너 자원
- run, create 명령어 에서 자원 할당량을 조정할 수 있음
- 이미 자원이 할당된 자원을 변경하려면 update 명령어 사용
docker update {변경할 자원} {컨테이너 이름}
docker update --cpuse-cpus=1 centos ubuntu
- 메모리 제한은
--memory=~g or ~m
- 컨테이너가 메모리를 초과하면 자동으로 종료됨
- 스왑메모리는
--memory-swap=500m
와 같이 지정할 수 있으며 지정이 없으면 자동으로 메모리의 2배가 지정
- cpu 제한을 전체 cpu의 비율로 하려면 각 컨테이너마다
--cpu-share{숫자}
로 하면 각 숫자를 비율화 한 만큼 컨테이너 간에 cpu를 할당해감 - 호스트에 여러 CPU가 있을 때 한 컨테이너에 하나의 cpu를 할당하고 싶다면
--cpuset-cpu={cpu번호}
로 특정 CPU를 지정- 3번째 CPU라면
--cpuset-cpu=2
- 3번째 CPU라면
- 컨테이너의 CFS 주기를 지정하기 위해선
--cpu-period
와--cpu-quota
를 조합해서 지정--cpu-period=100000 \ --cpu-quota=25000
을 하면 일반적인 컨테이너보다 CPU 성능이 1/4로 줄어듦(cpu-quota / cpu-period)
이미지
save 혹은 export
명령어를 쓰면 로컬에 단일 파일로 이미지를 저장할 수 있음docker save -o {저장할 파일 이름} sujaebuntu
load 혹은 import
명령어를 쓰면 로컬에 저장된 단일 파일을 이미지로 바꿀 수 있음docker load -i {저장된 파일 이름}
- 이용하는 이미지에 불필요한 이미지 레이어가 들어있다면 해당 이미지로 컨테이너를 생성하고
docker export -> docker import
명령어를 실행하면 컨테이너를 이미지로 만들어 용량을 줄일 수 있음- 대신 이미지 설정은 사라짐
Dockerfile
- 명령어에 대한 간단한 설명
FROM golang ADD main.go /root WORKDIR /root RUN go build -o /root/mainApp /root/main.go FROM alpine:latest WORKDIR /root COPY --from=0 /root/mainApp . CMD ["./mainApp"]
- FROM
- 베이스 이미지를 지정
FROM ubuntu:14.04
- LABEL
- 이미지의 메타데이터
- 키:값 형태로 저장됨
LABEL maintainer "sujae"
- maintaier 라벨을 추가해서 이미지의 생성자 정보를 넣자
- RUN
- 컨테이너 내부에서 실행하는 명령어
RUN apt-get update
- 도커 파일로 이미지를 생성하면 생성 중에 Y/N 를 선택하지 못하기 때문에 기본적으로 yes를 하는 -y 옵션을 붙여야함
- 중괄호를 이용하여 셸 사용 가능
RUN
명령어가 하나의 이미지 레이어가 된다는 감각으로 작성- 여러개의
RUN
을 실행하게 될 경우 이미지의 크기가 커질 수 있으니&&
등을 이용하여 정리할 수 있는 명령어는 정리
- 여러개의
RUN ["/bin/bash","echo hello >> test.txt"]
- ADD
- 파일을 이미지에 추가
- Dockerfile이 위치한 디렉토리의 파일을 이미지에 추가함
- 여러 개의 파일을 추가할 수 있음
ADD {디렉터리의 파일}, {추가할 파일}... {컨테이너에서 저장할 위치}
ADD test.html /var/www/html
COPY
명령어는 로컬의 파일만 이미지에 추가하지만ADD
는 외부 URL 및 tar 파일도 포함 가능
- WORKDIR
- 명령어를 실행할 디렉터리를 지정
- bash의 cd 명령어와 같음
WORKDIR /var/www/html
- EXPOSE
- Dockerfile로 빌드된 이미지에서 노출할 포트 지정
EXPOSE 80
- CMD
- 컨테이너가 시작될 때마다 실행할 명령어로 단 한번만 사용 가능
CMD apachectl -DFOREGROUND
- 위의 커맨드를 Dockerfile에 지정해두면 컨테이너를 생성할 때 별도의 커맨드를 입력하지 않아도 자동으로 적용된 상태로 실행됨
- ENV
- Dockerfile에서 사용될 환경변수 지정
ENV {name} {value}
ENV name sujae
- VOLUME
- 생성한 컨테이너의 볼륨에서 호스트와 공유할 디렉터리를 지정
- 호스트의
/var/lib/docker/voulme
에서 공유된 디렉터리를 확인 가능 VOLUME["/foo/bar", "/foo"]
VOLUME["/usr/bin"]
- ARG
- build 명령어를 실행할 때 추가로 입력받는 변수를 설정
ARG {변수명}
ARG PORT_NUM
- 이후
dockeer build --build-arg PORT_NUM=80
등과 같이 변수를 지정
- USER
- 컨테이너 내에서 사용될 사용자 이름이나 UDI를 설정하면
USER
아래의 명령어는 모두 지정한 사용자로 실행됨 USER app-1
- 컨테이너 내에서 사용될 사용자 이름이나 UDI를 설정하면
- ONBUILD
- Onbuild를 지정한 이미지로 새로운 이미지를 만들 때 Onbuild에 지정한 명령어가 실행
ONBUILD RUN echo "HELLO"
- STOPSIGNAL
- 컨테이너가 정지될 때 보낼 시그널을 지정
- 지정하지 않으면 기본 값으로
SIGTERM
STOPSIGNAL {시그널 이름 혹은 번호}
- HEALTHCHECK
- 컨테이너에서 동작하는 프로세스의 상태 체크
docker ps
로 해당 컨테이너의 상태(STATUS)를 확인할 수 있음- healthy / unhealthy
HEALTHCHECK --interval={반복 주기} --timeout={실패로 판단하는 시간} --retries={실패 기준 횟수} CMD {명령어}
HEALTHCHECK --interval=1m --timeout=5s --retries=2 CMD app
- SHELL
- 실행하는 셸을 지정
SHELL ["/usr/local/zsh"]
- FROM
- Dockerfile은
build
명령어를 사용docker build -t {저장될 이름} {빌드할 위치}
docker build -t sujaestudy:0.0 ./
- 빌드 후에는 그대로 사용하면 됨
docker run -d -P --name myserver sujaestudy:0.0
- 이미지를 생성하는 데 필요한 각종 파일, 소스코드, 메타데이터 등을 담고 있는 빌드 컨텍스트를 읽음
- Dockerfile이 위치한 디렉터리
- 컨텍스트는 빌드 명령어의 맨 마지막에 지정된 위치에 있는 파일을 전부 포함
- git 같은 외부 URL에서 Dockerfile을 읽어 들이다면 해당 저장소에 있는 파일과 서브 모듈을 전부 포함
- 따라서 Dockerfile이 위치한 곳에는 이미지 빌드에 필요한 파일만 있는 것이 바람직
- 루트 디렉터리에서 빌드 하지 않도록
.gitignore
같은 기능을 하는.dockerignore
를 사용할 수 있음
- 한 번 이미지 빌드를 마치고 난 뒤 다시 같은 빌드를 진행하면 이전의 이미지 빌드에서 사용했던 캐시를 사용
- 캐시를 사용하지 않으려면
--no-cache
옵션을build
명령어에 추가
- 캐시를 사용하지 않으려면
- 어떠한 이미지에 사용되는 각종 패키지 및 라이브러리가 불필요하게 이미지의 크기를 차지하는 경우에는 멀티 스테이지 빌드를 사용
- 하나의 Dockerfile 안에 여러 개의 FROM 이미지를 정의하여 빌드 완료 시 최종적으로 생성될 이미지의 크기를 줄이는 역할
- 다음과 같이 지정하여 두 번째 FROM을 지정
- COPY 의
--from=0
은 첫 번째 FROM 에서 빌드된 이미지를 가르킴
- COPY 의
끝으로
도커의 개요와 명령어, dockerfile 에 대해 간략하게 정리하였습니다.
다음에는 도커 데몬과 쿠버네티스 등에 대해 간략하게 정리해보려 합니다!
긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!
본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !